﻿namespace IdGen;

/// <summary>
/// 向 <see cref="IdGenerator"/> 提供时间数据
/// </summary>
/// <remarks>
/// 除非另有指定，否则 <see cref="DefaultTimeSource"/>（默认时间源）的一个时间刻度的默认持续时间为 1 毫秒
/// </remarks>
/// <param name="epoch">The epoch to use as an offset from now,</param>
/// <param name="tickDuration">The duration of a tick for this timesource.</param>
public class DefaultTimeSource(DateTimeOffset epoch, TimeSpan tickDuration) : StopwatchTimeSource(epoch, tickDuration)
{
    /// <summary>
    /// Initializes a new <see cref="DefaultTimeSource"/> object.
    /// </summary>
    /// <param name="epoch">The epoch to use as an offset from now.</param>
    /// <remarks>The default tickduration is 1 millisecond.</remarks>
    public DefaultTimeSource(DateTimeOffset epoch)
        : this(epoch, TimeSpan.FromMilliseconds(1)) { }

    /// <summary>
    /// 返回 <see cref="DefaultTimeSource"/> 的当前时间刻度数
    /// </summary>
    /// <returns>一个 <see cref="IdGenerator"/> 在创建标识符（Id）时要使用的当前时间刻度数</returns>
    /// <remarks>
    /// 请注意，“时间刻度（tick）” 是由时间源定义的一个时间段；这可以是任何有效的 <see cref="TimeSpan"/>，可以是一毫秒、一小时、2.5 秒或任何其他值
    /// </remarks>
    public override long GetTicks() => (Offset.Ticks + Elapsed.Ticks) / TickDuration.Ticks;
}